﻿using System;
using System.IO;
using System.Data;
using System.Windows;
using System.Collections;
using System.Windows.Input;
using System.ComponentModel;
using System.Windows.Controls;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls;
using Sinacor.Infra.UI.Controls.SmartClient;
using System.Collections.Generic;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;
using Sinacor.UI.Bovespa.Alocacao.Presenter;
using Sinacor.UI.Bovespa.Ordens.View.SmartClient;
using Sinacor.UI.Bovespa.Clientes.View.SmartClient;
namespace Sinacor.UI.Bovespa.Alocacao.View.SmartClient
{
    /// <summary>
    /// DistribuicaoNegocios
    /// </summary>
    public partial class DistribuicaoNegocios : SinacorWindow, IDistribuicaoNegocios, IAlocacaoBase
    {
        #region Construtor

        /// <summary>
        /// Método construtor da clase
        /// </summary>
        public DistribuicaoNegocios()
        {
            this.InitializeComponent();
            Presenter = new Presenter.DistribuicaoNegocios(this);

            Presenter.Inicializar();
            cmbDataPregao.ItemsSource = Presenter.ListaCalendarios;
            cmbDataPregao.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
            this.DataContext = this.Presenter;
            this.dtgNegociosDisponiveis.NewItemType = typeof(Model.NegocioNaoDistribuido);
            this.dtgNegociosDistribuidos.NewItemType = typeof(Model.NegocioDistribuido);
            this.Limpar();

        }

        public string _style = string.Empty;

        #endregion

        #region Propriedades

        /// <summary>
        /// Presenter
        /// </summary>
        public Presenter.DistribuicaoNegocios Presenter { get; set; }

        #endregion

        #region IDistribuicaoNegocios Members

        public void AbrirDistribuicaoNegociosDigitacao()
        {

            ModelCollection<Model.NegocioNaoDistribuido> negocios = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.NegocioNaoDistribuido>();

            foreach (var item in dtgNegociosDisponiveis.SelectedItems)
            {
                negocios.Add((Model.NegocioNaoDistribuido)item);
            }
            var windowDigitacao = new DistribuicaoNegociosDigitacao(negocios);
            windowDigitacao.ShowDialog();
        }

        public void AtualizarListaDisponiveis()
        {
            this.dtgNegociosDisponiveis.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void AtualizarListaDistribuidos()
        {
            this.dtgNegociosDistribuidos.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void BloquearTela()
        {
            this.IsEnabled = false;
        }

        public void InformarCancelamentoRealizado()
        {
            SinacorMessageBox.Show(FindResource(" Bovespa.Alocacao.Message.MovOrdensNaoFechado").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarMovOrdensFechado()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Alocacao.Message.MovOrdensNaoFechado").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarUsuarioSemPermissao()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Ordens.Message.UsuarioSemPermissao").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        #endregion

        #region IAlocacaoBase Members

        public void ApresentarNegocioDistribuido()
        {
            _style = BaseRow.GridRowBusiness10;
        }

        public void AtualizarListaCalendarios()
        {
            cmbDataPregao.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        #endregion

        /// <summary>
        /// Limpar
        /// </summary>
        private void Limpar()
        {
            Presenter.LimparFiltro();

            this.ClearServiceErrors();

            this.cmbDataPregao.SelectedIndex = 0;
            this.txtCliente.Text = String.Empty;
            this.txtAtivo.Text = String.Empty;
            this.txtDe.Text = String.Empty;
            this.txtAte.Text = String.Empty;

            Presenter.ListaDisponiveis = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.NegocioNaoDistribuido>();
            Presenter.ListaDistribuidos = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.NegocioDistribuido>();

            this.dtgNegociosDisponiveis.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            this.dtgNegociosDistribuidos.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);

        }


        private void ContextMenu_CancelarDistribuicao_Click(object sender, RoutedEventArgs e)
        {
            ModelCollection<Model.NegocioDistribuido> negocios = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.NegocioDistribuido>();

            foreach (var item in dtgNegociosDistribuidos.SelectedItems)
            {                
                negocios.Add((Model.NegocioDistribuido)item);
            }

            foreach (var item in negocios)
            {
                item.Negocio = item.NegocioNaoDistribuido;
                item.DadosAlocacao = item.DadosDistribuicao;
            }

            Presenter.ExcluirNegocioDistribuido(negocios);
        }

        private void ContextMenu_DigitarDistribuicao_Click(object sender, RoutedEventArgs e)
        {

            Sinacor.UI.Bovespa.Alocacao.View.SmartClient.DistribuicaoNegociosDigitacao DistribuicaoNegociosDigitacao = null;

            if (this.dtgNegociosDisponiveis.SelectedItem != null)
            {
                ModelCollection<Model.NegocioNaoDistribuido> negSel = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.NegocioNaoDistribuido>();
                foreach (Model.NegocioNaoDistribuido item in dtgNegociosDisponiveis.SelectedItems)
                {
                    negSel.Add(item);
                }
                DistribuicaoNegociosDigitacao = new DistribuicaoNegociosDigitacao(negSel);

            }
            else
            {
                DistribuicaoNegociosDigitacao = new DistribuicaoNegociosDigitacao();
            }
            DistribuicaoNegociosDigitacao.Owner = this;
            DistribuicaoNegociosDigitacao.SetMenuHeader("Bovespa.Alocacao.Label.DistribuicaoNegocios");

            DistribuicaoNegociosDigitacao.Show();


        }

        private void BtnNovaPesquisa_Click(object sender, RoutedEventArgs e)
        {
            Limpar();
        }

        private void BtnPesquisa_Click(object sender, RoutedEventArgs e)
        {
            this.ShowUserWaitingProcess();

            if (RblCompra.IsChecked.Value)
                this.Presenter.FiltroNegocioDistribuicao.NaturezaOperacao = Model.Enum.NaturezaOperacao.Compra;
            else if (RblVenda.IsChecked.Value)
                this.Presenter.FiltroNegocioDistribuicao.NaturezaOperacao = Model.Enum.NaturezaOperacao.Venda;
            else
                this.Presenter.FiltroNegocioDistribuicao.NaturezaOperacao = null;

            Presenter.FiltroNegocioDistribuicao.DataPregao = (DateTime)this.cmbDataPregao.SelectedValue;
            Presenter.FiltroNegocioDistribuicao.CodigoNegocio = txtAtivo.Text;
            Presenter.FiltroNegocioDistribuicao.NumeroNegocioDe = (int?)txtDe.Value;
            Presenter.FiltroNegocioDistribuicao.NumeroNegocioAte = (int?)txtAte.Value;
            Presenter.FiltroNegocioDistribuicao.Cliente = (int?)txtCliente.Value;

            Presenter.ConsultarNegocios();
            this.HideUserWaitingProcess();

        }

        private void dtgNegociosDisponiveis_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            Presenter.HabilitarMenuDigitarDistribuicao(Presenter.ListaDisponiveis);
        }

        private void btnPesquisarCliente_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            PesquisaClientes pesquisaClientes = new PesquisaClientes();
            Clientes.Model.PesquisaCliente filtroPesq = new Sinacor.UI.Bovespa.Clientes.Model.PesquisaCliente() { Apelido = txtCliente.Text };
            pesquisaClientes.CarregaParametros(Sinacor.UI.Bovespa.Clientes.Model.Enum.JanelaChamada.CasamentoManual, filtroPesq);
            pesquisaClientes.Owner = this;
            pesquisaClientes.SetMenuHeader("Bovespa.Ordens.Label.CasamentoManual");
            pesquisaClientes.ShowDialog();

            if (pesquisaClientes.PesquisaClienteModel.Codigo.HasValue)
            {
                this.Presenter.FiltroNegocioDistribuicao.Cliente = pesquisaClientes.PesquisaClienteModel.Codigo.Value;
                txtCliente.UpdateTarget(SinacorTextBox.TextProperty);
            }
        }

        private void btnPesquisarAtivo_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {

            Ordens.Model.Titulo modelTitulo = new Ordens.Model.Titulo();
            modelTitulo.Codigo = txtAtivo.Text;
            modelTitulo.Mercado = null;
            PesquisaTitulo pesquisaTitulo = new PesquisaTitulo();
            pesquisaTitulo.CarregarParametros(modelTitulo, null);
            pesquisaTitulo.Owner = this;
            pesquisaTitulo.SetMenuHeader("Bovespa.Ordens.Label.CasamentoManual");
            pesquisaTitulo.ShowDialog();

            if (pesquisaTitulo.TituloEscolhido != null)
            {
                this.Presenter.FiltroNegocioDistribuicao.CodigoNegocio = pesquisaTitulo.TituloEscolhido.Codigo;
                txtAtivo.UpdateTarget(SinacorTextBox.TextProperty);
            }

        }


        private void dtgNegociosDistribuidos_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                _style = string.Empty;
                if (e.OriginalSource is BaseRow)
                {
                    this.Presenter.VerificarNegocioDistribuido(((Model.NegocioDistribuido)e.ItemInfo.Item));
                }
                e.Style = _style;
            }
        }

        private void ContextMenu_CancelarDistribuicao_Loaded(object sender, RoutedEventArgs e)
        {
            if (e.OriginalSource is SinacorContextMenuItem)
            {
                if (dtgNegociosDistribuidos.SelectedItems.Count > 0)
                {
                    foreach (Model.NegocioDistribuido item in dtgNegociosDistribuidos.SelectedItems)
                    {
                        if( item.NegocioNaoDistribuido.Ordem != null && item.NegocioNaoDistribuido.Ordem.NumeroOrdem > 0)
                            ((SinacorContextMenuItem)sender).IsEnabled = false;
                        else
                            ((SinacorContextMenuItem)sender).IsEnabled = true;
                    }
                }
                else
                    ((SinacorContextMenuItem)sender).IsEnabled = false;

            }
        }

        private void ContextMenu_DigitarDistribuicao_Loaded(object sender, RoutedEventArgs e)
        {
            if (e.OriginalSource is SinacorContextMenuItem)
            {
                ModelCollection<Model.NegocioNaoDistribuido> negocios = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.NegocioNaoDistribuido>();

                foreach (var item in dtgNegociosDisponiveis.SelectedItems)
                {
                    negocios.Add((Model.NegocioNaoDistribuido)item);
                }

                Presenter.HabilitarMenuDigitarDistribuicao(negocios);

                ((SinacorContextMenuItem)sender).IsEnabled = this.Presenter.MenuDigitarDistribuicaoHabilitado;

            }
        }

        public void InformarNenhumRegistroEncontrado()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Alocacao.Message.PesquisaSemRetorno").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }
    }

}

